const { Category, Product } = require('@models');

/**
 * 获取小程序分类列表
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.getCategories = async (req, res) => {
  try {
    // 查询所有状态为启用的分类
    const categories = await Category.findAll({
      where: {
        status: 1 // 状态为启用
      },
      attributes: ['id', 'name', 'sort'],
      order: [['sort', 'ASC']] // 按照排序字段升序排列
    });

    // 格式化返回数据
    const formattedCategories = categories.map(category => {
      const item = category.toJSON();
      return {
        id: item.id,
        name: item.name
      };
    });

    return res.json({
      code: 200,
      message: 'success',
      data: formattedCategories
    });
  } catch (error) {
    console.error('获取小程序分类列表失败:', error);
    return res.status(500).json({
      code: 500,
      message: '获取分类列表失败: ' + error.message
    });
  }
};

/**
 * 获取小程序分类详情
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.getCategoryDetail = async (req, res) => {
  try {
    const { id } = req.params;
    
    // 查询指定分类
    const category = await Category.findOne({
      where: {
        id,
        status: 1 // 状态为启用
      },
      attributes: ['id', 'name', 'parent_id']
    });

    // 分类不存在或已禁用
    if (!category) {
      return res.status(404).json({
        code: 404,
        message: '分类不存在或已禁用'
      });
    }

    // 查询该分类下的子分类
    const children = await Category.findAll({
      where: {
        parent_id: id,
        status: 1
      },
      attributes: ['id', 'name']
    });

    // 格式化返回数据
    const result = category.toJSON();
    result.children = children;

    return res.json({
      code: 200,
      message: 'success',
      data: result
    });
  } catch (error) {
    console.error('获取小程序分类详情失败:', error);
    return res.status(500).json({
      code: 500,
      message: '获取分类详情失败: ' + error.message
    });
  }
};

/**
 * 获取分类下的商品列表
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
exports.getCategoryProducts = async (req, res) => {
  try {
    const { id } = req.params;
    // 默认每页显示5条记录
    const { page = 1, pageSize = 5 } = req.query;
    
    // 检查分类是否存在
    const category = await Category.findOne({
      where: { 
        id, 
        status: 1 
      }
    });
    
    if (!category) {
      return res.status(404).json({
        code: 404,
        message: '分类不存在或已禁用'
      });
    }
    
    // 计算分页参数
    const offset = (parseInt(page) - 1) * parseInt(pageSize);
    const limit = parseInt(pageSize);
    
    // 查询该分类下的商品
    const { count, rows: products } = await Product.findAndCountAll({
      where: {
        category_id: id,
        status: 1 // 只查询上架状态的商品
      },
      offset,
      limit,
      order: [
        ['sales', 'DESC'],
        ['create_time', 'DESC']
      ],
      attributes: ['id', 'name', 'cover', 'price', 'original_price', 'sales']
    });
    
    return res.json({
      code: 200,
      message: 'success',
      data: products,
      pagination: {
        total: count,
        page: parseInt(page),
        pageSize: limit
      }
    });
  } catch (error) {
    console.error('获取分类商品失败:', error);
    return res.status(500).json({
      code: 500,
      message: '获取分类商品失败: ' + error.message
    });
  }
}; 